package obligatorio;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;

public class Simulacion {
	
	private static final String ARCHIVO_DE_LECTURA  = "C:\\ArchivoDeCarga.txt";
	public static String ARCHIVO_DE_ESCRITURA = "Salida.txt";
	public static int tiempo;
	public static String lineasArchivo="";

	/**
	 * @param args
	 */
	public static void main(String args[]) throws InterruptedException{
		

		
		try {
			comenzar(ARCHIVO_DE_LECTURA);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	/**
	 * Comienza la simulacion con el archivo que se le pasa por parametros.
	 * @param archivo
	 * @throws InterruptedException
	 */
	public static void comenzar(String archivo) throws InterruptedException{
		
		List<Thread> threads = new ArrayList<Thread>();
		Central911 unaCentral =new Central911(archivo);	
		tiempo = -1;
		String[] file=ManejadorArchivos.leerArchivo(unaCentral.nombreArchivo);
		int filesize=file.length;
		Semaphore mutex= new Semaphore(1);
		Semaphore vacio = new Semaphore(filesize);
		Semaphore ocupado= new Semaphore(0);

		Semaphore semOperador1= new Semaphore(0);
		Semaphore semOperador2= new Semaphore(0);
		Semaphore semOperador3= new Semaphore(0);
		Semaphore semPlanificador = new Semaphore(1);
		Semaphore semTiempo= new Semaphore(3);
		
		Semaphore semListaA= new Semaphore(1);
		Semaphore semListaB= new Semaphore(1);
		Semaphore semListaC= new Semaphore(1);
		
		Operador op1 = new Operador(1,"A",mutex,ocupado,vacio,semOperador1,semTiempo, "00", unaCentral,semListaA,semListaB,semListaC);
		Operador op2 = new Operador(2,"A",mutex,ocupado,vacio,semOperador2,semTiempo, "00", unaCentral,semListaA,semListaB,semListaC);
		Operador op3 = new Operador(3,"A",mutex,ocupado,vacio,semOperador3,semTiempo, "00", unaCentral,semListaA,semListaB,semListaC);
		Planificador pl = new Planificador (mutex, semPlanificador, unaCentral,semListaA,semListaB,semListaC, vacio);
		Timer reloj = new Timer(mutex,vacio,ocupado,semTiempo,semOperador1,semOperador2,semOperador3,unaCentral,semPlanificador);

		threads.add(reloj);
		threads.add(op1);
		threads.add(op2);
		threads.add(op3);
		threads.add(pl);

		for (Thread thread: threads) {
			thread.start();
		}
		for (Thread thread: threads) {
			thread.join();
		}
	}
}
